package com.filldream.fastboot.common.util;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * @author RickSun
 * @version 1.0
 * @data 2021-10-14 11:00
 * @description 数学运算工具
 */
public class MathUtil {

    /**
     * @author RickSun
     * @Description 对象转换成BigDecimal
     * @param number 数字字符串 仅限于基本的数字类型，文本类型和对象无法转换
     **/
    public static BigDecimal toBigDecimal(Object number){
        return new BigDecimal(number.toString());
    }

    /**
     * @author RickSun
     * @Description 加减步长数据
     * @example Long number = condition ? number + operand : number - operand
     * @param number 源数据
     * @param condition 加减判断条件 true-加 false-减
     * @param operand 增加或减少的数
     * @return number
     **/
    public static BigDecimal stepAdd(Object number,boolean condition,Object operand){
        if( number == null || operand == null ){
            return BigDecimal.ZERO;
        }
        BigDecimal numberBigDecimal = toBigDecimal(number);
        BigDecimal operandBigDecimal = toBigDecimal(operand);
        return condition ? numberBigDecimal.add(operandBigDecimal) : numberBigDecimal.subtract(operandBigDecimal);
    }

    /**
     * @author RickSun
     * @Description 加减步长数据,默认加减1
     * @example Long number = condition ? number + operand : number - operand
     * @param number 源数据
     * @param condition 加减判断条件 true-加 false-减
     * @return number
     **/
    public static BigDecimal stepAdd(Object number,boolean condition){
        return stepAdd(number,condition,BigDecimal.ONE);
    }

    /**
     * @author RickSun
     * @Description 除法运算
     * @param dividend 被除数(被除数不能为0)
     * @param divisor 除数
     * @Exception 可能会出现被除数不能为0，或者算出来是无限小数的情况
     **/
    public static BigDecimal divide(Object dividend , Object divisor) {
        return toBigDecimal(dividend).divide( toBigDecimal(divisor) );
    }

    /**
     * @author RickSun
     * @Description 除法运算，运算结果保留模式
     * @param dividend 被除数(被除数不能为0)
     * @param divisor 除数
     * @param roundingMode 模式，具体对应详见:https://blog.csdn.net/alanzyy/article/details/8465098
     * @param decimals 保留小数位数
     * @Exception 可能会出现被除数不能为0的异常
     **/
    public static BigDecimal divide(Object dividend , Object divisor, RoundingMode roundingMode,int decimals) {
        return toBigDecimal(dividend).divide( toBigDecimal(divisor),decimals,roundingMode );
    }

    /**
     * @author RickSun
     * @Description 乘法
     **/
    public static BigDecimal multiply(Object first, Object second) {
        return toBigDecimal(first).multiply( toBigDecimal(second) );
    }

    /**
     * @author RickSun
     * @Description 减法
     **/
    public static BigDecimal subtract(Object first, Object second) {
        return toBigDecimal(first).subtract( toBigDecimal(second) );
    }

    /**
     * @author RickSun
     * @Description 加法
     **/
    public static BigDecimal sum(Object first, Object second) {
        return toBigDecimal(first).add( toBigDecimal(second) );
    }

}